package com.company.笔试.括号序列;

import java.util.LinkedList;
import java.util.Stack;

/**
 * @ClassName Solution
 * @Description TODO
 * @Author ylr
 * @Date 2021/7/21 11:03
 * @Version 1.0
 */
public class Solution {

    //开始和结束标识
    private static char[] start = {'(', '{', '['};
    private static char[] end = {')', '}', ']'};

    //判断t在开始集中并返回下标
    private int inStart(char t) {

        for (int i = 0; i <start.length ; i++) {
            if (start[i]==t) return i;
        }
        return -1;

    }
    //判断t在结束集中并返回下标
    private int inEnd(char t) {
        for (int i = 0; i <end.length ; i++) {
            if (end[i]==t) return i;
        }
        return -1;


    }

    private Stack<Character> stack = new Stack<>();

    public boolean isValid(String s) {

        int length = s.length();
        /*如果长度小于1或者第一个字符是结束符 返回false*/
        if (length<=1||inEnd(s.charAt(0))>=0) return false;


        int i = 0;
        while (i < length) {
            char c = s.charAt(i);
            /*遍历判断是否在开始集中，在开始集中就入栈，不在就去匹配*/
            if (inStart(c)>=0) {
                stack.push(c);
            } else {
                /*匹配 如果栈为空就说明没有匹配对象返回false*/
                if (stack.isEmpty()) return false;
                /*匹配 开始下标和结束下标是否一样 一样跳过否则返回false*/
                if (!stack.isEmpty()&&inEnd(c) == inStart(stack.peek())) {
                    stack.pop();
                } else return false;
            }
            i++;

        }
        /*最后 判断一下栈是否为空   为空匹配完成返回true否则匹配出错返回false*/
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println(new Solution().isValid("(("));
    }

}
